package edu.tfh.s2.ehkbot.inventar;

import edu.tfh.s2.ehkbot.daten.Protokoll;
import edu.tfh.s2.ehkbot.steuerung.Position;
import edu.tfh.s2.ehkbot.steuerung.Positionierbar;

/**
 * Das Regalfach wird in WarenboxRegal benötig. Es hat eine Position und beinhaltet eine Warenbox.
 * 
 * @author s2zehn
 */
public class Regalfach extends Positionierbar {
	/**
	 * Bildet die Statuse von Regalfach ab.
	 */
	public enum Belegung {
		BELEGT, DEFEKT, FREI
	}

	/**
	 * Wird geworfen von Methoden des Regal fachs wenn ein fehler vorliegt.
	 */
	public class RegalfachException extends java.lang.Exception {
		private static final long serialVersionUID = 1L;

		public RegalfachException() {
			super();
		}

		public RegalfachException(String arg0) {
			super(arg0);
		}

		public RegalfachException(String arg0, Throwable arg1) {
			super(arg0, arg1);
		}

		public RegalfachException(Throwable arg0) {
			super(arg0);
		}
	}

	private static final long serialVersionUID = 3983132708730674195L;

	/**
	 * Der Status des Regalfaches.
	 */
	private Belegung belegung;
	private Warenbox warenbox;

	/**
	 * Der Konstruktor für Regalfach.
	 */
	public Regalfach() {
		belegung = Belegung.FREI;
		warenbox = null;
	}

	/**
	 * Konstruktor für Regalfach. Initialiesiert das Regalfach mit einer Warebox und Position.
	 * 
	 * @param warenbox
	 *            Die Warenbox.
	 * @param position
	 *            Die Position.
	 */
	public Regalfach(Warenbox warenbox, Position position) {
		super(position);
		this.belegung = Belegung.BELEGT;
		this.warenbox = warenbox;
	}

	/**
	 * Setzt den Status des Regalfaches auf frei.
	 */
	public void befreie() {
		if (istFrei())
			Protokoll.getInstanc().warnung(
				"Regalfach.befreie()",
				"Befreie wurde auf ein freies Regalfach aufgerufen",
				2);
		belegung = Belegung.FREI;
		warenbox = null;
	}

	/**
	 * Belegt das Regalfach mit der Warenbox.
	 * 
	 * @param warenbox
	 *            Die Warenbox.
	 * @throws RegalfachException
	 *             Wird geworfen wenn das Fach nicht frei ist.
	 */
	public void belege(Warenbox warenbox) throws RegalfachException {
		if (!istFrei())
			throw new RegalfachException("Regalfach ist nicht Frei");
		this.warenbox = warenbox;
		this.belegung = Belegung.BELEGT;
	}

	/**
	 * Liefert den Status des Regalfaches.
	 * 
	 * @return Den Status des Regalfaches.
	 */
	public Belegung getStatus() {
		return belegung;
	}

	/**
	 * Liefert die Warebox.
	 * 
	 * @return Die Warenbox.
	 */
	public Warenbox getWarenbox() {
		return warenbox;
	}

	/**
	 * Gibt zurück ob das Fach belegt ist.
	 * 
	 * @return true wenn es belegt ist.
	 */
	public boolean istBelegt() {
		return belegung == Belegung.BELEGT;
	}

	/**
	 * Gibt zurück ob das Fach Defekt ist.
	 * 
	 * @return true wenn es defekt ist.
	 */
	public boolean istDefekt() {
		return belegung == Belegung.DEFEKT;
	}

	/**
	 * Gibt zurück ob das Fach frei ist.
	 * 
	 * @return true wenn es Frei ist.
	 */
	public boolean istFrei() {
		return belegung == Belegung.FREI;
	}

	/**
	 * Makiert das Fach als defekt.
	 */
	public void setDefekt() {
		belegung = Belegung.DEFEKT;
	}
}
